{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8fe19b15",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy\n",
    "import matplotlib.pyplot as plt\n",
    "from pandas import read_csv\n",
    "import math\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.layers import LSTM\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from pandas import concat\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d273afaa",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pandas import read_csv\n",
    "from datetime import datetime\n",
    "# load data\n",
    "dataset = read_csv('shang04_min.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8f931387",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    ����ʱ��  �й�������Сֵ��kw��  ��  ��.1  һ��ڼ���  һ��ڼ���.1  weekday  ����  \\\n",
      "0  2019/1/1         23758.7970   1     1        1          1        1     1   \n",
      "1  2019/1/2         20231.6265   1     2        2          1        2     1   \n",
      "2  2019/1/3         20443.6182   1     3        3          1        3     1   \n",
      "3  2019/1/4         19858.1592   1     4        4          1        4     1   \n",
      "4  2019/1/5         19766.6994   1     5        5          1        5     1   \n",
      "\n",
      "   �Ƿ��³�  �Ƿ���ĩ  �Ƿ񼾽ڳ�  �Ƿ񼾽�ĩ  �Ƿ���ĩ.1  ����״��  ����¶�  ����¶�.1  \\\n",
      "0       1       0      1      0         0      3.0    12.0       7.0   \n",
      "1       0       0      0      0         0      5.0    11.0       6.0   \n",
      "2       0       0      0      0         0      2.0    15.0       9.0   \n",
      "3       0       0      0      0         0      3.0    17.0      12.0   \n",
      "4       0       0      0      0         1      3.0    17.0      12.0   \n",
      "\n",
      "   �����������  ҹ����������  \n",
      "0         11.0          8.0  \n",
      "1         11.0          8.0  \n",
      "2         11.0          8.0  \n",
      "3         11.0          8.0  \n",
      "4         11.0          8.0  \n"
     ]
    }
   ],
   "source": [
    "print(dataset.head(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2543c3f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# manually specify column names\n",
    "#dataset.drop('Unnamed: 0 ', axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "82c5bfba",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    ����ʱ��  �й�������Сֵ��kw��  ��  ��.1  һ��ڼ���  һ��ڼ���.1  weekday  ����  \\\n",
      "0  2019/1/1         23758.7970   1     1        1          1        1     1   \n",
      "1  2019/1/2         20231.6265   1     2        2          1        2     1   \n",
      "2  2019/1/3         20443.6182   1     3        3          1        3     1   \n",
      "3  2019/1/4         19858.1592   1     4        4          1        4     1   \n",
      "4  2019/1/5         19766.6994   1     5        5          1        5     1   \n",
      "\n",
      "   �Ƿ��³�  �Ƿ���ĩ  �Ƿ񼾽ڳ�  �Ƿ񼾽�ĩ  �Ƿ���ĩ.1  ����״��  ����¶�  ����¶�.1  \\\n",
      "0       1       0      1      0         0      3.0    12.0       7.0   \n",
      "1       0       0      0      0         0      5.0    11.0       6.0   \n",
      "2       0       0      0      0         0      2.0    15.0       9.0   \n",
      "3       0       0      0      0         0      3.0    17.0      12.0   \n",
      "4       0       0      0      0         1      3.0    17.0      12.0   \n",
      "\n",
      "   �����������  ҹ����������  \n",
      "0         11.0          8.0  \n",
      "1         11.0          8.0  \n",
      "2         11.0          8.0  \n",
      "3         11.0          8.0  \n",
      "4         11.0          8.0  \n"
     ]
    }
   ],
   "source": [
    "print(dataset.head(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b9af4d79",
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset.columns = ['数据时间','有功功率最大值（kw）','月','天','一年第几天','一年第几周','weekday','季节','是否月初','是否月末','是否季节初','是否季节末','是否周末','天气状况','最高温度','最低温度','白天风力风向','夜晚风力风向']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "7424ebc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset.drop('数据时间', axis=1, inplace=True)\n",
    "# summarize first 5 rows\n",
    "#print(dataset.head(5))\n",
    "# save to file\n",
    "dataset.to_csv('power.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3a01e663",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      有功功率最大值（kw）   月   天  一年第几天  一年第几周  weekday  季节  是否月初  是否月末  是否季节初  \\\n",
      "0     23758.79700   1   1      1      1        1   1     1     0      1   \n",
      "1     20231.62650   1   2      2      1        2   1     0     0      0   \n",
      "2     20443.61820   1   3      3      1        3   1     0     0      0   \n",
      "3     19858.15920   1   4      4      1        4   1     0     0      0   \n",
      "4     19766.69940   1   5      5      1        5   1     0     0      0   \n",
      "...           ...  ..  ..    ...    ...      ...  ..   ...   ...    ...   \n",
      "1060  15265.26420  11  26    330     47        4   4     0     0      0   \n",
      "1061  15104.84208  11  27    331     47        5   4     0     0      0   \n",
      "1062  14580.61884  11  28    332     47        6   4     0     0      0   \n",
      "1063  14167.03644  11  29    333     48        0   4     0     0      0   \n",
      "1064  13975.62468  11  30    334     48        1   4     0     1      0   \n",
      "\n",
      "      是否季节末  是否周末  天气状况   最高温度   最低温度  白天风力风向  夜晚风力风向  \n",
      "0         0     0  3.00  12.00   7.00   11.00    8.00  \n",
      "1         0     0  5.00  11.00   6.00   11.00    8.00  \n",
      "2         0     0  2.00  15.00   9.00   11.00    8.00  \n",
      "3         0     0  3.00  17.00  12.00   11.00    8.00  \n",
      "4         0     1  3.00  17.00  12.00   11.00    8.00  \n",
      "...     ...   ...   ...    ...    ...     ...     ...  \n",
      "1060      0     0  2.00  25.80  16.35   15.20   12.20  \n",
      "1061      0     1  2.00  23.65  15.30   19.40   16.40  \n",
      "1062      0     1  1.15  21.40  13.50   21.15   18.15  \n",
      "1063      0     0  1.85  22.05  13.65   15.20   12.20  \n",
      "1064      0     0  1.15  22.50  14.20   20.40   17.40  \n",
      "\n",
      "[1065 rows x 17 columns]\n"
     ]
    }
   ],
   "source": [
    "print(dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4c4e13a4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<bound method NDFrame.head of       var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)  var5(t-1)  var6(t-1)  \\\n",
      "1      0.869942   0.000000   0.000000   0.000000   0.000000   0.166667   \n",
      "2      0.740204   0.000000   0.033333   0.002740   0.000000   0.333333   \n",
      "3      0.748002   0.000000   0.066667   0.005479   0.000000   0.500000   \n",
      "4      0.726467   0.000000   0.100000   0.008219   0.000000   0.666667   \n",
      "5      0.723103   0.000000   0.133333   0.010959   0.000000   0.833333   \n",
      "...         ...        ...        ...        ...        ...        ...   \n",
      "1060   0.555256   0.909091   0.800000   0.898630   0.884615   0.500000   \n",
      "1061   0.557529   0.909091   0.833333   0.901370   0.884615   0.666667   \n",
      "1062   0.551629   0.909091   0.866667   0.904110   0.884615   0.833333   \n",
      "1063   0.532347   0.909091   0.900000   0.906849   0.884615   1.000000   \n",
      "1064   0.517134   0.909091   0.933333   0.909589   0.903846   0.000000   \n",
      "\n",
      "      var7(t-1)  var8(t-1)  var9(t-1)  var10(t-1)  var11(t-1)  var12(t-1)  \\\n",
      "1           0.0        1.0        0.0         1.0         0.0         0.0   \n",
      "2           0.0        0.0        0.0         0.0         0.0         0.0   \n",
      "3           0.0        0.0        0.0         0.0         0.0         0.0   \n",
      "4           0.0        0.0        0.0         0.0         0.0         0.0   \n",
      "5           0.0        0.0        0.0         0.0         0.0         1.0   \n",
      "...         ...        ...        ...         ...         ...         ...   \n",
      "1060        1.0        0.0        0.0         0.0         0.0         0.0   \n",
      "1061        1.0        0.0        0.0         0.0         0.0         0.0   \n",
      "1062        1.0        0.0        0.0         0.0         0.0         1.0   \n",
      "1063        1.0        0.0        0.0         0.0         0.0         1.0   \n",
      "1064        1.0        0.0        0.0         0.0         0.0         0.0   \n",
      "\n",
      "      var13(t-1)  var14(t-1)  var15(t-1)  var16(t-1)  var17(t-1)   var1(t)  \n",
      "1        0.25000    0.071429    0.153846    0.000000    0.000000  0.740204  \n",
      "2        0.50000    0.035714    0.115385    0.000000    0.000000  0.748002  \n",
      "3        0.12500    0.178571    0.230769    0.000000    0.000000  0.726467  \n",
      "4        0.25000    0.250000    0.346154    0.000000    0.000000  0.723103  \n",
      "5        0.25000    0.250000    0.346154    0.000000    0.000000  0.757680  \n",
      "...          ...         ...         ...         ...         ...       ...  \n",
      "1060     0.11250    0.594643    0.569231    0.634375    0.634375  0.557529  \n",
      "1061     0.12500    0.564286    0.513462    0.262500    0.262500  0.551629  \n",
      "1062     0.12500    0.487500    0.473077    0.525000    0.525000  0.532347  \n",
      "1063     0.01875    0.407143    0.403846    0.634375    0.634375  0.517134  \n",
      "1064     0.10625    0.430357    0.409615    0.262500    0.262500  0.510093  \n",
      "\n",
      "[1064 rows x 18 columns]>\n"
     ]
    }
   ],
   "source": [
    "# prepare data for lstm\n",
    "from pandas import DataFrame\n",
    "from pandas import concat\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "\n",
    "# convert series to supervised learning\n",
    "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n",
    "    n_vars = 1 if type(data) is list else data.shape[1]\n",
    "    df = DataFrame(data)\n",
    "    cols, names = list(), list()\n",
    "    # input sequence (t-n, ... t-1)\n",
    "    for i in range(n_in, 0, -1):\n",
    "        cols.append(df.shift(i))\n",
    "        names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]\n",
    "    # forecast sequence (t, t+1, ... t+n)\n",
    "    for i in range(0, n_out):\n",
    "        cols.append(df.shift(-i))\n",
    "        if i == 0:\n",
    "            names += [('var%d(t)' % (j+1)) for j in range(n_vars)]\n",
    "        else:\n",
    "            names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]\n",
    "    # put it all together\n",
    "    agg = concat(cols, axis=1)\n",
    "    agg.columns = names\n",
    "    # drop rows with NaN values\n",
    "    if dropnan:\n",
    "        agg.dropna(inplace=True)\n",
    "    return agg\n",
    "\n",
    "# load dataset\n",
    "dataset = read_csv('power.csv', header=0, index_col=0)\n",
    "values = dataset.values\n",
    "# integer encode direction\n",
    "encoder = LabelEncoder()\n",
    "values[:,4] = encoder.fit_transform(values[:,4])\n",
    "# ensure all data is float\n",
    "values = values.astype('float32')\n",
    "# normalize features\n",
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "scaled = scaler.fit_transform(values)\n",
    "# frame as supervised learning\n",
    "reframed = series_to_supervised(scaled, 1, 1)\n",
    "# drop columns we don't want to predict\n",
    "reframed.drop(reframed.columns[[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33]], axis=1, inplace=True)\n",
    "#print(reframed.head())\n",
    "print(reframed.head)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "31d34811",
   "metadata": {},
   "outputs": [],
   "source": [
    "#plt.plot(reframed)\n",
    "#plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b8a051ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(973, 1, 17) (973,) (91, 1, 17) (91,)\n"
     ]
    }
   ],
   "source": [
    "...\n",
    "# split into train and test sets\n",
    "values = reframed.values\n",
    "n_train_hours = int(len(reframed)-91)\n",
    "train = values[:n_train_hours, :]\n",
    "test = values[n_train_hours:, :]\n",
    "# split into input and outputs\n",
    "train_X, train_y = train[:, :-1], train[:, -1]\n",
    "test_X, test_y = test[:, :-1], test[:, -1]\n",
    "# reshape input to be 3D [samples, timesteps, features]\n",
    "train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n",
    "test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))\n",
    "print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f1dfb13d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "14/14 - 1s - loss: 0.5308 - val_loss: 0.3853 - 1s/epoch - 92ms/step\n",
      "Epoch 2/100\n",
      "14/14 - 0s - loss: 0.2910 - val_loss: 0.1021 - 30ms/epoch - 2ms/step\n",
      "Epoch 3/100\n",
      "14/14 - 0s - loss: 0.1729 - val_loss: 0.1644 - 29ms/epoch - 2ms/step\n",
      "Epoch 4/100\n",
      "14/14 - 0s - loss: 0.1426 - val_loss: 0.1206 - 28ms/epoch - 2ms/step\n",
      "Epoch 5/100\n",
      "14/14 - 0s - loss: 0.1252 - val_loss: 0.0864 - 27ms/epoch - 2ms/step\n",
      "Epoch 6/100\n",
      "14/14 - 0s - loss: 0.1188 - val_loss: 0.0876 - 27ms/epoch - 2ms/step\n",
      "Epoch 7/100\n",
      "14/14 - 0s - loss: 0.1090 - val_loss: 0.0849 - 29ms/epoch - 2ms/step\n",
      "Epoch 8/100\n",
      "14/14 - 0s - loss: 0.1012 - val_loss: 0.0759 - 28ms/epoch - 2ms/step\n",
      "Epoch 9/100\n",
      "14/14 - 0s - loss: 0.0957 - val_loss: 0.0713 - 30ms/epoch - 2ms/step\n",
      "Epoch 10/100\n",
      "14/14 - 0s - loss: 0.0908 - val_loss: 0.0662 - 30ms/epoch - 2ms/step\n",
      "Epoch 11/100\n",
      "14/14 - 0s - loss: 0.0869 - val_loss: 0.0625 - 29ms/epoch - 2ms/step\n",
      "Epoch 12/100\n",
      "14/14 - 0s - loss: 0.0838 - val_loss: 0.0577 - 31ms/epoch - 2ms/step\n",
      "Epoch 13/100\n",
      "14/14 - 0s - loss: 0.0811 - val_loss: 0.0543 - 30ms/epoch - 2ms/step\n",
      "Epoch 14/100\n",
      "14/14 - 0s - loss: 0.0789 - val_loss: 0.0508 - 31ms/epoch - 2ms/step\n",
      "Epoch 15/100\n",
      "14/14 - 0s - loss: 0.0768 - val_loss: 0.0476 - 30ms/epoch - 2ms/step\n",
      "Epoch 16/100\n",
      "14/14 - 0s - loss: 0.0748 - val_loss: 0.0451 - 33ms/epoch - 2ms/step\n",
      "Epoch 17/100\n",
      "14/14 - 0s - loss: 0.0732 - val_loss: 0.0426 - 31ms/epoch - 2ms/step\n",
      "Epoch 18/100\n",
      "14/14 - 0s - loss: 0.0720 - val_loss: 0.0407 - 31ms/epoch - 2ms/step\n",
      "Epoch 19/100\n",
      "14/14 - 0s - loss: 0.0707 - val_loss: 0.0402 - 29ms/epoch - 2ms/step\n",
      "Epoch 20/100\n",
      "14/14 - 0s - loss: 0.0696 - val_loss: 0.0385 - 30ms/epoch - 2ms/step\n",
      "Epoch 21/100\n",
      "14/14 - 0s - loss: 0.0689 - val_loss: 0.0372 - 30ms/epoch - 2ms/step\n",
      "Epoch 22/100\n",
      "14/14 - 0s - loss: 0.0681 - val_loss: 0.0371 - 31ms/epoch - 2ms/step\n",
      "Epoch 23/100\n",
      "14/14 - 0s - loss: 0.0673 - val_loss: 0.0351 - 31ms/epoch - 2ms/step\n",
      "Epoch 24/100\n",
      "14/14 - 0s - loss: 0.0667 - val_loss: 0.0345 - 31ms/epoch - 2ms/step\n",
      "Epoch 25/100\n",
      "14/14 - 0s - loss: 0.0660 - val_loss: 0.0350 - 30ms/epoch - 2ms/step\n",
      "Epoch 26/100\n",
      "14/14 - 0s - loss: 0.0653 - val_loss: 0.0335 - 31ms/epoch - 2ms/step\n",
      "Epoch 27/100\n",
      "14/14 - 0s - loss: 0.0649 - val_loss: 0.0331 - 30ms/epoch - 2ms/step\n",
      "Epoch 28/100\n",
      "14/14 - 0s - loss: 0.0643 - val_loss: 0.0336 - 29ms/epoch - 2ms/step\n",
      "Epoch 29/100\n",
      "14/14 - 0s - loss: 0.0637 - val_loss: 0.0325 - 31ms/epoch - 2ms/step\n",
      "Epoch 30/100\n",
      "14/14 - 0s - loss: 0.0633 - val_loss: 0.0322 - 30ms/epoch - 2ms/step\n",
      "Epoch 31/100\n",
      "14/14 - 0s - loss: 0.0628 - val_loss: 0.0318 - 30ms/epoch - 2ms/step\n",
      "Epoch 32/100\n",
      "14/14 - 0s - loss: 0.0624 - val_loss: 0.0313 - 32ms/epoch - 2ms/step\n",
      "Epoch 33/100\n",
      "14/14 - 0s - loss: 0.0619 - val_loss: 0.0307 - 30ms/epoch - 2ms/step\n",
      "Epoch 34/100\n",
      "14/14 - 0s - loss: 0.0616 - val_loss: 0.0302 - 28ms/epoch - 2ms/step\n",
      "Epoch 35/100\n",
      "14/14 - 0s - loss: 0.0613 - val_loss: 0.0301 - 30ms/epoch - 2ms/step\n",
      "Epoch 36/100\n",
      "14/14 - 0s - loss: 0.0614 - val_loss: 0.0298 - 29ms/epoch - 2ms/step\n",
      "Epoch 37/100\n",
      "14/14 - 0s - loss: 0.0608 - val_loss: 0.0297 - 29ms/epoch - 2ms/step\n",
      "Epoch 38/100\n",
      "14/14 - 0s - loss: 0.0600 - val_loss: 0.0295 - 31ms/epoch - 2ms/step\n",
      "Epoch 39/100\n",
      "14/14 - 0s - loss: 0.0596 - val_loss: 0.0293 - 31ms/epoch - 2ms/step\n",
      "Epoch 40/100\n",
      "14/14 - 0s - loss: 0.0595 - val_loss: 0.0301 - 30ms/epoch - 2ms/step\n",
      "Epoch 41/100\n",
      "14/14 - 0s - loss: 0.0600 - val_loss: 0.0303 - 30ms/epoch - 2ms/step\n",
      "Epoch 42/100\n",
      "14/14 - 0s - loss: 0.0594 - val_loss: 0.0292 - 31ms/epoch - 2ms/step\n",
      "Epoch 43/100\n",
      "14/14 - 0s - loss: 0.0585 - val_loss: 0.0300 - 31ms/epoch - 2ms/step\n",
      "Epoch 44/100\n",
      "14/14 - 0s - loss: 0.0578 - val_loss: 0.0295 - 31ms/epoch - 2ms/step\n",
      "Epoch 45/100\n",
      "14/14 - 0s - loss: 0.0591 - val_loss: 0.0345 - 32ms/epoch - 2ms/step\n",
      "Epoch 46/100\n",
      "14/14 - 0s - loss: 0.0599 - val_loss: 0.0301 - 31ms/epoch - 2ms/step\n",
      "Epoch 47/100\n",
      "14/14 - 0s - loss: 0.0575 - val_loss: 0.0288 - 32ms/epoch - 2ms/step\n",
      "Epoch 48/100\n",
      "14/14 - 0s - loss: 0.0566 - val_loss: 0.0286 - 30ms/epoch - 2ms/step\n",
      "Epoch 49/100\n",
      "14/14 - 0s - loss: 0.0571 - val_loss: 0.0312 - 29ms/epoch - 2ms/step\n",
      "Epoch 50/100\n",
      "14/14 - 0s - loss: 0.0582 - val_loss: 0.0363 - 35ms/epoch - 3ms/step\n",
      "Epoch 51/100\n",
      "14/14 - 0s - loss: 0.0587 - val_loss: 0.0312 - 33ms/epoch - 2ms/step\n",
      "Epoch 52/100\n",
      "14/14 - 0s - loss: 0.0565 - val_loss: 0.0287 - 30ms/epoch - 2ms/step\n",
      "Epoch 53/100\n",
      "14/14 - 0s - loss: 0.0555 - val_loss: 0.0285 - 32ms/epoch - 2ms/step\n",
      "Epoch 54/100\n",
      "14/14 - 0s - loss: 0.0555 - val_loss: 0.0308 - 30ms/epoch - 2ms/step\n",
      "Epoch 55/100\n",
      "14/14 - 0s - loss: 0.0574 - val_loss: 0.0436 - 28ms/epoch - 2ms/step\n",
      "Epoch 56/100\n",
      "14/14 - 0s - loss: 0.0600 - val_loss: 0.0363 - 29ms/epoch - 2ms/step\n",
      "Epoch 57/100\n",
      "14/14 - 0s - loss: 0.0561 - val_loss: 0.0299 - 28ms/epoch - 2ms/step\n",
      "Epoch 58/100\n",
      "14/14 - 0s - loss: 0.0550 - val_loss: 0.0376 - 28ms/epoch - 2ms/step\n",
      "Epoch 59/100\n",
      "14/14 - 0s - loss: 0.0541 - val_loss: 0.0285 - 29ms/epoch - 2ms/step\n",
      "Epoch 60/100\n",
      "14/14 - 0s - loss: 0.0575 - val_loss: 0.0564 - 28ms/epoch - 2ms/step\n",
      "Epoch 61/100\n",
      "14/14 - 0s - loss: 0.0636 - val_loss: 0.0337 - 29ms/epoch - 2ms/step\n",
      "Epoch 62/100\n",
      "14/14 - 0s - loss: 0.0554 - val_loss: 0.0429 - 27ms/epoch - 2ms/step\n",
      "Epoch 63/100\n",
      "14/14 - 0s - loss: 0.0558 - val_loss: 0.0361 - 30ms/epoch - 2ms/step\n",
      "Epoch 64/100\n",
      "14/14 - 0s - loss: 0.0563 - val_loss: 0.0528 - 28ms/epoch - 2ms/step\n",
      "Epoch 65/100\n",
      "14/14 - 0s - loss: 0.0664 - val_loss: 0.0324 - 30ms/epoch - 2ms/step\n",
      "Epoch 66/100\n",
      "14/14 - 0s - loss: 0.0563 - val_loss: 0.0549 - 33ms/epoch - 2ms/step\n",
      "Epoch 67/100\n",
      "14/14 - 0s - loss: 0.0625 - val_loss: 0.0373 - 30ms/epoch - 2ms/step\n",
      "Epoch 68/100\n",
      "14/14 - 0s - loss: 0.0615 - val_loss: 0.0695 - 30ms/epoch - 2ms/step\n",
      "Epoch 69/100\n",
      "14/14 - 0s - loss: 0.0763 - val_loss: 0.0322 - 30ms/epoch - 2ms/step\n",
      "Epoch 70/100\n",
      "14/14 - 0s - loss: 0.0562 - val_loss: 0.0554 - 30ms/epoch - 2ms/step\n",
      "Epoch 71/100\n",
      "14/14 - 0s - loss: 0.0628 - val_loss: 0.0312 - 29ms/epoch - 2ms/step\n",
      "Epoch 72/100\n",
      "14/14 - 0s - loss: 0.0629 - val_loss: 0.0491 - 29ms/epoch - 2ms/step\n",
      "Epoch 73/100\n",
      "14/14 - 0s - loss: 0.0670 - val_loss: 0.0322 - 30ms/epoch - 2ms/step\n",
      "Epoch 74/100\n",
      "14/14 - 0s - loss: 0.0573 - val_loss: 0.0485 - 30ms/epoch - 2ms/step\n",
      "Epoch 75/100\n",
      "14/14 - 0s - loss: 0.0613 - val_loss: 0.0392 - 33ms/epoch - 2ms/step\n",
      "Epoch 76/100\n",
      "14/14 - 0s - loss: 0.0642 - val_loss: 0.0351 - 30ms/epoch - 2ms/step\n",
      "Epoch 77/100\n",
      "14/14 - 0s - loss: 0.0595 - val_loss: 0.0395 - 31ms/epoch - 2ms/step\n",
      "Epoch 78/100\n",
      "14/14 - 0s - loss: 0.0590 - val_loss: 0.0407 - 30ms/epoch - 2ms/step\n",
      "Epoch 79/100\n",
      "14/14 - 0s - loss: 0.0594 - val_loss: 0.0500 - 30ms/epoch - 2ms/step\n",
      "Epoch 80/100\n",
      "14/14 - 0s - loss: 0.0674 - val_loss: 0.0299 - 29ms/epoch - 2ms/step\n",
      "Epoch 81/100\n",
      "14/14 - 0s - loss: 0.0553 - val_loss: 0.0506 - 30ms/epoch - 2ms/step\n",
      "Epoch 82/100\n",
      "14/14 - 0s - loss: 0.0606 - val_loss: 0.0344 - 31ms/epoch - 2ms/step\n",
      "Epoch 83/100\n",
      "14/14 - 0s - loss: 0.0575 - val_loss: 0.0528 - 30ms/epoch - 2ms/step\n",
      "Epoch 84/100\n",
      "14/14 - 0s - loss: 0.0666 - val_loss: 0.0320 - 32ms/epoch - 2ms/step\n",
      "Epoch 85/100\n",
      "14/14 - 0s - loss: 0.0536 - val_loss: 0.0445 - 39ms/epoch - 3ms/step\n",
      "Epoch 86/100\n",
      "14/14 - 0s - loss: 0.0575 - val_loss: 0.0313 - 32ms/epoch - 2ms/step\n",
      "Epoch 87/100\n",
      "14/14 - 0s - loss: 0.0580 - val_loss: 0.0415 - 30ms/epoch - 2ms/step\n",
      "Epoch 88/100\n",
      "14/14 - 0s - loss: 0.0596 - val_loss: 0.0310 - 30ms/epoch - 2ms/step\n",
      "Epoch 89/100\n",
      "14/14 - 0s - loss: 0.0539 - val_loss: 0.0416 - 30ms/epoch - 2ms/step\n",
      "Epoch 90/100\n",
      "14/14 - 0s - loss: 0.0562 - val_loss: 0.0343 - 31ms/epoch - 2ms/step\n",
      "Epoch 91/100\n",
      "14/14 - 0s - loss: 0.0584 - val_loss: 0.0384 - 29ms/epoch - 2ms/step\n",
      "Epoch 92/100\n",
      "14/14 - 0s - loss: 0.0580 - val_loss: 0.0347 - 31ms/epoch - 2ms/step\n",
      "Epoch 93/100\n",
      "14/14 - 0s - loss: 0.0553 - val_loss: 0.0406 - 30ms/epoch - 2ms/step\n",
      "Epoch 94/100\n",
      "14/14 - 0s - loss: 0.0582 - val_loss: 0.0497 - 31ms/epoch - 2ms/step\n",
      "Epoch 95/100\n",
      "14/14 - 0s - loss: 0.0645 - val_loss: 0.0295 - 30ms/epoch - 2ms/step\n",
      "Epoch 96/100\n",
      "14/14 - 0s - loss: 0.0536 - val_loss: 0.0457 - 32ms/epoch - 2ms/step\n",
      "Epoch 97/100\n",
      "14/14 - 0s - loss: 0.0582 - val_loss: 0.0313 - 30ms/epoch - 2ms/step\n",
      "Epoch 98/100\n",
      "14/14 - 0s - loss: 0.0563 - val_loss: 0.0497 - 30ms/epoch - 2ms/step\n",
      "Epoch 99/100\n",
      "14/14 - 0s - loss: 0.0633 - val_loss: 0.0305 - 29ms/epoch - 2ms/step\n",
      "Epoch 100/100\n",
      "14/14 - 0s - loss: 0.0519 - val_loss: 0.0415 - 30ms/epoch - 2ms/step\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "...\n",
    "# design network\n",
    "model = Sequential()\n",
    "model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))\n",
    "model.add(Dense(1))\n",
    "model.compile(loss='mae', optimizer='adam')\n",
    "# fit network\n",
    "history = model.fit(train_X, train_y, epochs=100, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)\n",
    "# plot history\n",
    "plt.plot(history.history['loss'], label='train')\n",
    "plt.plot(history.history['val_loss'], label='test')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "64a0d2b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# make predictions\n",
    "#trainPredict = model.predict(train_X)\n",
    "#testPredict = model.predict(test_X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7c7a3607",
   "metadata": {},
   "outputs": [],
   "source": [
    "...\n",
    "# make a prediction\n",
    "yhat = model.predict(test_X)\n",
    "test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "2e095d4f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(91, 1) (91, 17)\n"
     ]
    }
   ],
   "source": [
    "yhat=DataFrame(yhat)\n",
    "test_X=DataFrame(test_X)\n",
    "print(yhat.shape,test_X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f5b552e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.773239</td>\n",
       "      <td>0.636364</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.663014</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.166667</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>0.785714</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>0.875000</td>\n",
       "      <td>0.875000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.823109</td>\n",
       "      <td>0.727273</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.665753</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.34375</td>\n",
       "      <td>0.864286</td>\n",
       "      <td>0.909615</td>\n",
       "      <td>0.525000</td>\n",
       "      <td>0.525000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.821265</td>\n",
       "      <td>0.727273</td>\n",
       "      <td>0.033333</td>\n",
       "      <td>0.668493</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.41250</td>\n",
       "      <td>0.857143</td>\n",
       "      <td>0.898077</td>\n",
       "      <td>0.525000</td>\n",
       "      <td>0.525000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.832374</td>\n",
       "      <td>0.727273</td>\n",
       "      <td>0.066667</td>\n",
       "      <td>0.671233</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.34375</td>\n",
       "      <td>0.867857</td>\n",
       "      <td>0.905769</td>\n",
       "      <td>0.525000</td>\n",
       "      <td>0.525000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.858484</td>\n",
       "      <td>0.727273</td>\n",
       "      <td>0.100000</td>\n",
       "      <td>0.673973</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.23125</td>\n",
       "      <td>0.860714</td>\n",
       "      <td>0.898077</td>\n",
       "      <td>0.587500</td>\n",
       "      <td>0.587500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>86</th>\n",
       "      <td>0.584252</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>0.898630</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.11250</td>\n",
       "      <td>0.594643</td>\n",
       "      <td>0.569231</td>\n",
       "      <td>0.634375</td>\n",
       "      <td>0.634375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87</th>\n",
       "      <td>0.581549</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>0.901370</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.12500</td>\n",
       "      <td>0.564286</td>\n",
       "      <td>0.513462</td>\n",
       "      <td>0.262500</td>\n",
       "      <td>0.262500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88</th>\n",
       "      <td>0.566938</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.866667</td>\n",
       "      <td>0.904110</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.12500</td>\n",
       "      <td>0.487500</td>\n",
       "      <td>0.473077</td>\n",
       "      <td>0.525000</td>\n",
       "      <td>0.525000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>89</th>\n",
       "      <td>0.531365</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>0.906849</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.01875</td>\n",
       "      <td>0.407143</td>\n",
       "      <td>0.403846</td>\n",
       "      <td>0.634375</td>\n",
       "      <td>0.634375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90</th>\n",
       "      <td>0.539242</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.909589</td>\n",
       "      <td>0.903846</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.10625</td>\n",
       "      <td>0.430357</td>\n",
       "      <td>0.409615</td>\n",
       "      <td>0.262500</td>\n",
       "      <td>0.262500</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>91 rows × 17 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3         4         5         6    7   \\\n",
       "0   0.773239  0.636364  1.000000  0.663014  0.653846  0.166667  0.666667  0.0   \n",
       "1   0.823109  0.727273  0.000000  0.665753  0.653846  0.333333  0.666667  1.0   \n",
       "2   0.821265  0.727273  0.033333  0.668493  0.653846  0.500000  0.666667  0.0   \n",
       "3   0.832374  0.727273  0.066667  0.671233  0.653846  0.666667  0.666667  0.0   \n",
       "4   0.858484  0.727273  0.100000  0.673973  0.653846  0.833333  0.666667  0.0   \n",
       "..       ...       ...       ...       ...       ...       ...       ...  ...   \n",
       "86  0.584252  0.909091  0.800000  0.898630  0.884615  0.500000  1.000000  0.0   \n",
       "87  0.581549  0.909091  0.833333  0.901370  0.884615  0.666667  1.000000  0.0   \n",
       "88  0.566938  0.909091  0.866667  0.904110  0.884615  0.833333  1.000000  0.0   \n",
       "89  0.531365  0.909091  0.900000  0.906849  0.884615  1.000000  1.000000  0.0   \n",
       "90  0.539242  0.909091  0.933333  0.909589  0.903846  0.000000  1.000000  0.0   \n",
       "\n",
       "     8    9    10   11       12        13        14        15        16  \n",
       "0   1.0  0.0  0.0  0.0  1.00000  0.785714  0.884615  0.875000  0.875000  \n",
       "1   0.0  0.0  0.0  0.0  0.34375  0.864286  0.909615  0.525000  0.525000  \n",
       "2   0.0  0.0  0.0  0.0  0.41250  0.857143  0.898077  0.525000  0.525000  \n",
       "3   0.0  0.0  0.0  0.0  0.34375  0.867857  0.905769  0.525000  0.525000  \n",
       "4   0.0  0.0  0.0  1.0  0.23125  0.860714  0.898077  0.587500  0.587500  \n",
       "..  ...  ...  ...  ...      ...       ...       ...       ...       ...  \n",
       "86  0.0  0.0  0.0  0.0  0.11250  0.594643  0.569231  0.634375  0.634375  \n",
       "87  0.0  0.0  0.0  0.0  0.12500  0.564286  0.513462  0.262500  0.262500  \n",
       "88  0.0  0.0  0.0  1.0  0.12500  0.487500  0.473077  0.525000  0.525000  \n",
       "89  0.0  0.0  0.0  1.0  0.01875  0.407143  0.403846  0.634375  0.634375  \n",
       "90  0.0  0.0  0.0  0.0  0.10625  0.430357  0.409615  0.262500  0.262500  \n",
       "\n",
       "[91 rows x 17 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_X[0]=yhat\n",
    "test_X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "02cb65cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "inv_yhat = scaler.inverse_transform(test_X)\n",
    "inv_yhat = inv_yhat[:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "887968dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# invert scaling for actual\n",
    "test_y = test_y.reshape((len(test_y), 1))\n",
    "test_X[0]=test_y\n",
    "inv_y = scaler.inverse_transform(test_X)\n",
    "inv_y = inv_y[:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "64783e5b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Score: 1909.161\n"
     ]
    }
   ],
   "source": [
    "# calculate RMSE\n",
    "from math import sqrt\n",
    "#trainScore = sqrt(mean_squared_error(train_y[0], inv_yhat[0]))\n",
    "#print('Train Score: %.3f RMSE' % (trainScore))\n",
    "rmse2 = sqrt(mean_squared_error(inv_y, inv_yhat))\n",
    "print('Test Score: %.3f' % rmse2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1c22321c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([22841.746 , 22059.686 , 22551.803 , 23323.908 , 22625.29  ,\n",
       "       22535.703 , 22647.67  , 12473.812 , 22418.516 , 22405.822 ,\n",
       "       23002.03  , 22603.938 , 22862.785 , 21804.908 , 21599.38  ,\n",
       "       21157.959 , 21656.496 , 21356.998 , 20840.562 , 20577.906 ,\n",
       "       20243.596 , 20423.717 , 20312.402 , 19593.45  , 19022.88  ,\n",
       "       19744.543 , 18987.318 , 17701.518 , 18770.76  , 19363.416 ,\n",
       "       19180.736 , 19117.031 , 19682.73  , 20424.143 , 20931.322 ,\n",
       "       19684.018 , 17790.734 , 17273.656 , 16767.191 , 16929.916 ,\n",
       "       17395.277 , 18524.994 , 18545.6   , 18391.166 , 18054.393 ,\n",
       "       18561.305 , 17448.936 , 17088.72  , 16484.611 , 16572.646 ,\n",
       "       16574.51  , 16128.29  , 16163.072 , 16075.708 , 16219.393 ,\n",
       "       16614.201 , 16564.94  , 16236.524 , 15870.463 , 15445.622 ,\n",
       "       15670.233 , 15940.773 , 16360.298 , 16099.95  , 15803.945 ,\n",
       "       15669.871 , 15485.453 , 15810.69  , 16104.446 , 12881.148 ,\n",
       "       15359.728 , 14714.287 , 14921.188 , 15393.987 , 15348.238 ,\n",
       "       15083.189 , 15176.966 , 15710.331 , 15861.301 , 16020.487 ,\n",
       "        7012.5957, 13898.646 , 16276.321 , 15586.586 , 14728.475 ,\n",
       "       15203.471 , 15265.266 , 15104.843 , 14580.619 , 14167.036 ,\n",
       "       13975.625 ], dtype=float32)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "227db62c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "91 91\n"
     ]
    }
   ],
   "source": [
    "print(len(inv_y),len(inv_yhat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a388d8c6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([21129.742 , 22485.557 , 22435.424 , 22737.453 , 23447.291 ,\n",
       "       22695.521 , 22836.943 , 22762.822 , 16255.87  , 22421.062 ,\n",
       "       22335.094 , 23071.184 , 22542.877 , 22813.64  , 22370.867 ,\n",
       "       21877.055 , 21340.639 , 21686.803 , 21554.473 , 21159.568 ,\n",
       "       21188.56  , 21135.947 , 20869.912 , 20533.209 , 20070.52  ,\n",
       "       19984.844 , 20048.443 , 19766.768 , 19206.564 , 19615.549 ,\n",
       "       20355.574 , 18919.033 , 19994.918 , 20264.102 , 20872.375 ,\n",
       "       21032.574 , 19811.744 , 18516.787 , 18257.    , 17821.059 ,\n",
       "       17868.582 , 18425.494 , 19064.527 , 18948.006 , 18637.633 ,\n",
       "       18546.445 , 19251.092 , 18074.008 , 17943.408 , 17712.729 ,\n",
       "       17330.271 , 17577.004 , 17068.602 , 17017.746 , 16734.627 ,\n",
       "       17119.88  , 17620.564 , 17462.277 , 17210.648 , 16483.943 ,\n",
       "       16487.32  , 16983.732 , 16673.107 , 17618.105 , 16878.916 ,\n",
       "       16668.432 , 16451.25  , 17079.006 , 16934.227 , 16856.969 ,\n",
       "       14708.4795, 16129.204 , 15603.249 , 16140.603 , 16624.27  ,\n",
       "       16151.761 , 16310.104 , 16589.893 , 16891.232 , 16586.176 ,\n",
       "       16553.656 , 11484.674 , 15336.184 , 16724.879 , 16141.523 ,\n",
       "       15651.283 , 15991.756 , 15918.274 , 15521.06  , 14553.941 ,\n",
       "       14768.09  ], dtype=float32)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv_yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "3314d790",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MAPE: 0.07741166\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import metrics\n",
    "def mape(y_true, y_pred):\n",
    "    return np.mean(np.abs((y_pred - y_true) / y_true))\n",
    "print('MAPE:',mape(inv_y, inv_yhat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "1f9a9a20",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R2-score: 0.5954154334641304\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import r2_score\n",
    "print('R2-score:',r2_score(inv_y, inv_yhat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "27b1d1c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x28c7f4f0790>]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(inv_yhat,'r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "334e9396",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "inv_yhat=pd.DataFrame(data=inv_yhat)\n",
    "inv_yhat.to_csv('inv_y.csv')\n",
    "inv_yhat.to_csv('shang04_min_pre.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "776d1290",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
